package persistencia.carreras.ensambladores.general;

import modelo.controles.Policia;

import modelo.geometria.Circunferencia;
import modelo.geometria.Figura;
import modelo.seniales.ISenial;
import compartido.IEntidad;

import persistencia.IAlmacen;
import persistencia.IEnsamblador;
import persistencia.IGondola;
import persistencia.IProducto;
import persistencia.carreras.ensambladores.Campos;
import persistencia.carreras.ensambladores.Dummies;
import persistencia.carreras.ensambladores.EnsambladorComun;
import persistencia.compartido.ArmadorReferencias;
import persistencia.compartido.CargadorDeClases;
import persistencia.compartido.ProductoSinValores;
import persistencia.compartido.Referencia;
import persistencia.compartido.Tipo;
import persistencia.excepciones.EscritorIncompatible;
import persistencia.excepciones.LectorIncompatible;

public class EnsambladorPolicia implements IEnsamblador {

	@Override
	public boolean esComptabile(IProducto p) {
		return true;
	}

	@Override
	public IEntidad leer(IProducto p, IAlmacen almacen) throws LectorIncompatible {
		
		long identificador = Long.valueOf(p.getNombre());
		Campos.leerPrioridad(p, "");
		Figura cuerpo = Campos.leerCuerpo(p, "");
		Circunferencia vision = Campos.leerVision(p,"");

		ArmadorReferencias refs = ArmadorReferencias.getInstancia();
		Referencia refSenial = refs.leerReferencia(Campos.leerSenial(p, ""));
		Tipo<IEntidad> tipo = CargadorDeClases.getInstancia().armarTipoDeEntidad(refSenial.getTipo());
		IGondola seniales = almacen.obtenerGondola(tipo);
		ISenial senial = null;
		if (seniales != null) {
			IEntidad e = seniales.obtener(refSenial.getIdentificador());
			if (e instanceof ISenial)
				senial = (ISenial)e;
		}
	
		double radio = 0;
		if (cuerpo instanceof Circunferencia)
			radio = ((Circunferencia)cuerpo).getRadio();
		
		Policia policia = new Policia(identificador, cuerpo.getCentro(), radio, vision.getRadio(), senial);
		return policia;
	}

	@Override
	public boolean esCompatible(IEntidad e) {
		return (e instanceof Policia);
	}

	@Override
	public IProducto escribir(IEntidad e, IAlmacen fabrica) throws EscritorIncompatible {
		if (!esCompatible(e))
			throw new EscritorIncompatible();
		
		Policia policia = (Policia)e;
		Tipo<IEntidad> tipo = new Tipo<IEntidad>(Policia.class);
		
		EnsambladorComun comun = new EnsambladorComun(fabrica);
		IProducto p = fabrica.crearProducto(Campos.identificador,policia.getIdentificador(),tipo);
		comun.armarControl(p, policia);
		
		return p;
	}

	@Override
	public IProducto getDummy(Tipo<IEntidad> tipo) throws EscritorIncompatible {
		
		Tipo<IEntidad> acepta = new Tipo<IEntidad>(Policia.class);
		if (!acepta.esSuperTipoDe(tipo))
			throw new EscritorIncompatible();
		
		ProductoSinValores p = new ProductoSinValores();
		p.agregarCampo(Campos.identificador);
		Dummies.esControl(p, "");
		
		return p;
	}

}
